#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
#include "ErreurInterpreteur.h"
using namespace std;

#define FICHIER_MOTS_CLE "motsCles.txt"

/*! \file Symbole.h
    \brief La spécification de la classe Symbole
    
    Décrit la liste des méthodes et attributs associés à la classe Symbole
    \author lazzamar
    \date 16/12/2012
 */
/*! \class Symbole
    \brief La classe représentant les symbole du langage.
    
    Cette classe permet de traiter les symboles du langages. Les
    méthodes suivantes sont associées aux tests et à l'accès:
    \li ==
    \li !=
    \li getChaine
	\li isMotCle
 */

class Symbole {
public:
	/*! \enum categorieSymbole
		\brief  Contient les types possibles pour un symbole.
	*/
	enum categorieSymbole {MOTCLE, VARIABLE, ENTIER, CHAINE, COMMENTAIRE, INDEFINI, FINDEFICHIER};
	
	/*! \fn Symbole(string s=string(""));
		\brief Constructeur de la classe Symbole

	 Ce constructeur construit le symbole avec la chaine lue par le lecteur
	 de symbole.
		\param string s=string("") - la chaine lue par le lecteur de symbole
	*/
	Symbole(string s=string("")); // construit le symbole à partir de la chaine (string) ch lue par le lecteur de symbole dans un fichier
	
	/*! \fn bool operator == (string ch) ;
		\brief Operateur de test égal.

	 Renvoie vrai si le symbole est égal à la chaine.
		\param string s=string("") - la chaine de test
		\return Vrai si même valeur, faux sinon.
	*/
	bool operator == (string ch) ; // pour tester l'égalité entre le symbole et une chaîne
	
	/*! \fn inline bool operator != (string ch) { return ! (*this == ch); }
		\brief Operateur de test différent.

	 Renvoie vrai si le symbole est différent de la chaine.
		\param string s=string("") - la chaine de test
		\return Vrai si valeurs différentes, faux sinon.
	*/
	inline bool operator != (string ch) { return ! (*this == ch); } // pour tester la différence...
	
	/*! \fn inline string getChaine()           { return this->chaine;}
		\brief Accesseur de la chaine du symbole.

	 Renvoie la chaine du symbole.
	 * \return Chaine du symbole
	*/
	inline string getChaine()           { return this->chaine;}     // accesseur
	
	
	friend ostream & operator <<(ostream & cout, Symbole symb);     // fonction amie pour pouvoir afficher un symbole sur cout 

private:
	/*! \var string chaine
		\brief  Contient la chaine du symbole.
	*/
	string           chaine;              // chaine du symbole
	
	/*! \var categorie
		\brief  Contient la catégorie du symbole (par rapport au type énuméré)
	*/
	categorieSymbole categorie;           // categorie du symbole (voir type énuméré ci-dessus)
	
	/*! \fn static bool      isMotCle(string s);
		\brief  Méthode de classe de test.
		
	 Renvoie vrai si la chaine est un mot clé du langage
	 * \return Vrai si c'est un motCle, faux sinon.
	*/
	static bool      isMotCle(string s);  // méthode de classe : renvoie vrai si s est un mot clé du langage
};

#endif /* SYMBOLE_H_ */
